package modelo.geometria;

/**
 * Modela a una circunferencia en el plano real.
 */
public class Circunferencia extends Figura {
	private Vector centro;
	private double radio;

	/*--- CONSTRUCTORES ---*/
	
	/** Construye una circunferencia de radio 0 en el origen. */
	public Circunferencia() {
		centro = new Vector(0,0);
		radio = 0;
	}

	/** Construye una circunferencia recibiendo su centro y su radio. */
	public Circunferencia(Vector centro, double radio) {
		this.radio = radio;
		this.centro = centro;
	}

	/*--- GETTERS Y SETTERS ---*/	

	@Override
	public Vector getCentro() {
		return centro;
	}
	
	public void setCentro(Vector centro) {
		this.centro = centro;
	}
	
	public double getRadio() {
		return radio;
	}
	
	public void setRadio(double radio) {
		this.radio = radio;
	}	
	
	/** Retorna el Vector que pertenece a la Circunferencia en el angulo dado. */
	public Vector getPunto(double radianes) {
		double x = radio * Math.cos(radianes);
		double y = radio * Math.sin(radianes);
		return new Vector(x,y);
	}
	
	/*--- OPERACIONES SOBRE ESTA CIRCUNFERENCIA ---*/

	/**
	 * Mueve a la Circunferencia.
	 */
	@Override
	public Figura mover(final Vector nuevaPosicion) {
		getCentro().mover(nuevaPosicion);
		return this;
	}
	
	/*--- DETECCIONES DE SOLAPAMIENTO (METODO solapa(...) ---*/
	
	/**
	 * Devuelve true si la circunferencia toca o contiene a la Figura.
	 */	
	@Override
	public boolean solapa(Figura otraFigura) {
		return otraFigura.solapa(this);
	}
	
	/**
	 * Devuelve true si la circunferencia contiene o toca al punto dado.
	 */
	public boolean solapa(Vector punto) {
		if (getCentro().getDistancia(punto) <= getRadio())
			return true;
		else return false;
	}
	
	/**
	 * Devuelve true si la circunferencia contiene o toca al centro del Rectangulo dado.
	 */
	@Override
	public boolean solapa(Rectangulo rectangulo) {
		if (getCentro().getDistancia(rectangulo.getCentro()) <= radio)
			return true;
		else return false;
	}
	
	/**
	 * Devuelve true si la circunferencia toca o contiene a otra circunferencia.
	 */
	@Override
	public boolean solapa(Circunferencia otraCircunferencia) { 
		return centro.getDistancia(otraCircunferencia.centro) <= getRadio() + otraCircunferencia.getRadio();
	}

	/**
	 * Devuelve true si la circunferencia toca o contiene al Segmento.
	 */	
	@Override
	public boolean solapa(SegmentoRecta segmentoRecta) {
		return segmentoRecta.solapa(this);
	}
	
}
